我已成功运行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
答案 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。