首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >patsy中的单热编码

patsy中的单热编码
EN

Stack Overflow用户
提问于 2017-10-19 14:44:21
回答 2查看 1.5K关注 0票数 1

对于回归,我通常使用sklearn的OneHotEncoder编码分类变量。

我现在正在探索使用patsy,但它似乎没有提供一种热编码:http://patsy.readthedocs.io/en/latest/categorical-coding.html

是否可以使用patsy指定一次热编码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-22 03:47:25

这里有两件事可能会有所帮助:(1) patsy默认包括一个拦截(在每个公式的开头有一个不可见的1 + ),(2)当编码一个分类值时,patsy会自动选择一种编码策略,以避免创建过参数化的模型。

如果你组合一个截距+全秩一热编码,那么你就得到了一个参数化的模型.所以patsy转向了处理编码(基本上是从您正在考虑的单一热编码中删除一列)。这避免了在编码列和截获列之间创建线性依赖关系。

避免这种情况的一个简单方法是删除拦截--然后patsy就不会担心线性依赖,并使用您期望的那种热编码:y ~ -1 + a ( -1取消了不可见的1以删除拦截)。

或者,如果您真的想要一个过度参数化的模型,那么如果您在链接到的docs页面上进一步向下滚动,它将告诉您如何定义任意的自定义编码方案。

代码语言:javascript
复制
import numpy as np
from patsy import ContrastMatrix

class FullRankOneHot(object):
    def __init__(self, reference=0):
        self.reference = reference

    # Called to generate a full-rank encoding
    def code_with_intercept(self, levels):
        return ContrastMatrix(np.eye(len(levels)),
                              ["[My.%s]" % (level,) for level in levels])

    # Called to generate a non-full-rank encoding. But we don't care,
    # we do what we want, and return a full-rank encoding anyway.
    # Take that, patsy.
    def code_without_intercept(self, levels):
        return self.code_with_intercept(levels)

然后您可以像:y ~ 1 + C(a, FullRankOneHot)那样使用它。

票数 5
EN

Stack Overflow用户

发布于 2017-10-19 15:22:39

您提供的链接中的第一个示例确实是一个热编码:

代码语言:javascript
复制
In [3]: data
Out[3]: {'a': ['a1', 'a2', 'a3', 'a1', 'a2', 'a3']}

In [4]: dmatrix("a", data)
Out[4]: 
DesignMatrix with shape (6, 3)
  Intercept  a[T.a2]  a[T.a3]
          1        0        0
          1        1        0
          1        0        1
          1        0        0
          1        1        0
          1        0        1
  Terms:
    'Intercept' (column 0)
    'a' (columns 1:3)

注意,要用3个级别编码一个分类变量,只需要2个二进制变量。本文档中的编码将a1作为基,并为a2a3再添加两个二进制变量。如果a2a3都是0,则表示值为a1

在sklearn的OneHotEncoder或熊猫的pd.get_dummies()中,它们返回一个矩阵,其列数与分类变量的级别相同,但包含一个额外的列,因为您可以用其他列中的值来表示其中一个列的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46832637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档