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

2024-07-03 07:00:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经成功地从scikit learnSGDClassifier包中运行了一个logistic回归模型,但是无法轻松地解释模型的系数(通过SGDClassifier.coef_访问),因为输入数据是通过scikit learn的OneHotEncoder进行转换的。在

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

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

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

^{pr2}$

产生一个形状数组(12000696):

X_OHE = np.array([[1,0,1...0,0,1],
                 [0,0,0...0,1,0],
                  ...
                 [1,0,1...0,0,1]
                 ])

然后,我用SGDClassifier.coef_访问模型的系数,它产生一个形状数组(1696):

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上发现了一个未回答的问题:How to retrieve coefficient names after label encoding and one hot encoding on scikit-learn?


Tags: 数据模型npbar数组scikitarraylearn
1条回答
网友
1楼 · 发布于 2024-07-03 07:00:35

在回顾了这个用户对OneHotEncoderhere的详细解释之后,我能够创建一个(有点骇人听闻的)方法来将模型系数与原始数据集联系起来。在

假设您已正确设置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模型,比如:

^{pr2}$

其系数为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(链接在顶部)的详细说明,否则下面的内容看起来像是胡言乱语。但简而言之,下面的代码迭代X_OHE中的每个feature,并使用enc内部的feature_indices参数来进行转换。在

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
...

所以,现在你可以说,“当员工在‘Foo1’部门时,目标变量增加了3.929413。在

相关问题 更多 >