当前位置 : 主页 > 网络推广 > seo >

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

来源:互联网 收集:自由互联 发布时间:2021-06-16
我已成功运行scikit-learn SGDClassifier软件包中的逻辑回归模型,但无法轻松解释模型的系数(通过SGDClassifier.coef_访问),因为输入数据是通过scikit-learn的 OneHotEncoder转换的. 我的原始输入数据X是
我已成功运行scikit-learn SGDClassifier软件包中的逻辑回归模型,但无法轻松解释模型的系数(通过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]
              ])

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

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

在回顾了这个用户对OneHotEncoder here的详细解释之后,我能够创建一种(有些黑客)的方法来将模型系数与原始数据集相关联.

假设您已正确设置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(顶部链接)上提到的详细说明,否则下面的内容看起来就像乱码.但简而言之,下面对X_OHE中的每个特征进行迭代,并使用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.

网友评论