对于回归,我通常使用sklearn的OneHotEncoder编码分类变量。
我现在正在探索使用patsy,但它似乎没有提供一种热编码:http://patsy.readthedocs.io/en/latest/categorical-coding.html。
是否可以使用patsy指定一次热编码?
发布于 2017-10-22 03:47:25
这里有两件事可能会有所帮助:(1) patsy默认包括一个拦截(在每个公式的开头有一个不可见的1 + ),(2)当编码一个分类值时,patsy会自动选择一种编码策略,以避免创建过参数化的模型。
如果你组合一个截距+全秩一热编码,那么你就得到了一个参数化的模型.所以patsy转向了处理编码(基本上是从您正在考虑的单一热编码中删除一列)。这避免了在编码列和截获列之间创建线性依赖关系。
避免这种情况的一个简单方法是删除拦截--然后patsy就不会担心线性依赖,并使用您期望的那种热编码:y ~ -1 + a ( -1取消了不可见的1以删除拦截)。
或者,如果您真的想要一个过度参数化的模型,那么如果您在链接到的docs页面上进一步向下滚动,它将告诉您如何定义任意的自定义编码方案。
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)那样使用它。
发布于 2017-10-19 15:22:39
您提供的链接中的第一个示例确实是一个热编码:
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作为基,并为a2和a3再添加两个二进制变量。如果a2和a3都是0,则表示值为a1。
在sklearn的OneHotEncoder或熊猫的pd.get_dummies()中,它们返回一个矩阵,其列数与分类变量的级别相同,但包含一个额外的列,因为您可以用其他列中的值来表示其中一个列的值。
https://stackoverflow.com/questions/46832637
复制相似问题