如何在Scikit模型运行后使用OneHotEncoding检索原始变量

时间:2017-07-11 17:46:34

标签: python numpy scikit-learn

我已成功运行scikit-learn SGDClassifier包中的逻辑回归模型,但无法轻易解释模型的系数(通过SGDClassifier.coef_访问),因为输入数据是通过scikit-learn's {{ 3}}

我的原始输入数据X具有形状(12000,11):

X = np.array([[1,4,3...9,4,1],
              [5,9,2...3,1,4],
              ...
              [7,8,1...6,7,8]
              ])

然后我应用了一个热门编码:

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
X_OHE = enc.fit_transform(X).toarray()

产生一个形状数组(12000,696):

X_OHE = np.array([[1,0,1...0,0,1],
                 [0,0,0...0,1,0],
                  ...
                 [1,0,1...0,0,1]
                 ])
然后我用SGDClassifier.coef_访问模型的系数,产生一个形状数组(1,696):

coefs = np.array([[-1.233e+00,0.9123e+00,-2.431e+00...-0.238e+01,-1.33e+00,0.001e-01]])

如何将系数值映射回X中的原始值,因此我可以说“如果变量foo的值为bar,则目标变量增加/减少bar_coeff“?

如果您需要有关数据或模型参数的更多信息,请与我们联系。谢谢。

我在SO上发现了一个未解决的问题:OneHotEncoder

1 个答案:

答案 0 :(得分:1)

在审核了此用户对OneHotEncoder here的详细说明后,我能够创建一种(有些黑客)方法,将模型系数与原始数据集相关联。< / p>

假设您已正确设置OneHotEncoder

from sklearn.preprocessing import OneHotEncoder
from scipy import sparse

enc = OneHotEncoder()
X_OHE = enc.fit_transform(X)   # X and X_OHE as described in question

你已经成功运行了一个GLM模型,比如说:

from sklearn import linear_model

clf = linear_model.SGDClassifier()
clf.fit(X_train, y_train)

其中有系数clf.coef_

print clf.coef_
# np.array([[-1.233e+00,0.9123e+00,-2.431e+00...-0.238e+01,-1.33e+00,0.001e-01]])

您可以使用以下方法将X_OHE中已编码的1和0跟踪回X中的原始值。我建议在OneHotEncoding(顶部链接)上阅读上面提到的详细解释,否则下面的内容会显得很乱。但简而言之,下面对feature中的每个X_OHE进行了迭代,并使用feature_indices内部的enc参数进行翻译。

import pandas as pd
import numpy as np
results = []

for i in range(enc.active_features_.shape[0]):
    f = enc.active_features_[i]

    index_range = np.extract(enc.feature_indices_ <= f, enc.feature_indices_)
    s = len(index_range) - 1
    f_index = index_range[-1]
    f_label_decoded = f - f_index

    results.append({
            'label_decoded_value': f_label_decoded,
            'coefficient': clf.coef_[0][i]
        })

R = pd.DataFrame.from_records(results)

R看起来像这样(我原来编码公司部门的名称):

coefficient label_decoded_value
3.929413    DepartmentFoo1
3.718078    DepartmentFoo2
3.101869    DepartmentFoo3
2.892845    DepartmentFoo4
...

所以,现在你可以说,&#34;当一名员工在部门&#39; Foo1&#39;时,目标变量增加3.929413。