patsy 中的 One-hot 编码

Don*_*ero 1 python machine-learning scikit-learn patsy

对于回归,我通常使用 sklearn 的OneHotEncoder.

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

是否可以使用 patsy 指定 One-hot 编码?

Nat*_*ith 5

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

如果你结合一个截取 + 全秩 one-hot 编码,那么你会得到一个过度参数化的模型。因此,patsy 切换到处理编码(= 基本上从您正在考虑的 one-hot 编码中删除一列)。这可以避免在编码列和截距列之间产生线性相关性。

一个简单的方法来避免这种情况是除去截-那么帕齐不会担心线性相关性,并会使用你所期待的那种独热编码:y ~ -1 + a(该-1抵消无形1删除拦截)。

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

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)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它像:y ~ 1 + C(a, FullRankOneHot)