从现有系数创建sklearn.linear_model.LogisticRegression实例

jon*_*ans 6 python scikit-learn logistic-regression

可以根据现有系数创建这样的实例,这些系数是在不同的实现(例如Java)中计算的吗?

我尝试创建一个实例,然后直接设置coef_和intercept_,它似乎工作,但我不确定这里是否有一个缺点或我是否可能会破坏某些东西.

Dav*_*ale 7

是的,它工作正常:

import numpy as np
from scipy.stats import norm
from sklearn.linear_model import LogisticRegression
import json
x = np.arange(10)[:, np.newaxis]
y = np.array([0,0,0,1,0,0,1,1,1,1])
# training one logistic regression
model1 = LogisticRegression(C=10, penalty='l1').fit(x, y)
# serialize coefficients (imitate loading from storage)
encoded = json.dumps((model1.coef_.tolist(), model1.intercept_.tolist(), model1.penalty, model1.C))
print(encoded)
decoded = json.loads(encoded)
# using coefficients in another regression
model2 = LogisticRegression()
model2.coef_ = np.array(decoded[0])
model2.intercept_ = np.array(decoded[1])
model2.penalty = decoded[2]
model2.C = decoded[3]
# resulting predictions are identical
print(model1.predict_proba(x) == model2.predict_proba(x))
Run Code Online (Sandbox Code Playgroud)

输出:

[[[0.7558780101653273]], [-3.322083150375962], "l1", 10]
[[ True  True]
 [ True  True]
 [ True  True]
 [ True  True]
 [ True  True]
 [ True  True]
 [ True  True]
 [ True  True]
 [ True  True]
 [ True  True]]
Run Code Online (Sandbox Code Playgroud)

因此,原始模型和重新创建的模型的预测确实是相同的。

  • 如果我可以补充一点,这个解决方案可能不适用于某些版本的 sklearn。我刚刚在 `scikit-learn 0.24.2` 上尝试过,您的解决方案给出了属性错误,指出逻辑回归对象没有属性“classes_”。解决方案是使用您需要的类进行设置,例如:“model2.classes_ = np.array([0, 1])”。 (4认同)