scikit-learn 逻辑回归预测与自我实现不同
scikit-learn Logistic Regression prediction not same as self-implementation
我使用 scikit-learn 的逻辑回归分类器 (multinomial/multiclass) 训练了一个模型。然后我将模型中的系数保存到一个文件中。接下来,我将系数加载到我自己的 softmax 自我实现中,这就是 scikit-learn's documentation 声称逻辑回归分类器用于多项式案例的内容。但是,预测不一致。
- 使用 scikit-learn 训练 mlogit 模型
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import json
# Split data into train-test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
# Train model
mlr = LogisticRegression(random_state=21, multi_class='multinomial', solver='newton-cg')
mlr.fit(X_train, y_train)
y_pred = mlr.predict(X_test)
# Save test data and coefficients
json.dump(X_test.tolist(), open('X_test.json'), 'w'), indent=4)
json.dump(y_pred.tolist(), open('y_pred.json'), 'w'), indent=4)
json.dump(mlr.classes_.tolist(), open('classes.json'), 'w'), indent=4)
json.dump(mlr.coef_.tolist(), open('weights.json'), 'w'), indent=4)
- 通过Scipy
自行实现softmax
from scipy.special import softmax
import numpy as np
import json
def predict(x, w, classes):
z = np.dot(x, np.transpose(w))
sm = softmax(z)
return [classes[i] for i in sm.argmax(axis=1)]
x = json.load(open('X_test.json'))
w = json.load(open('weights.json'))
classes = json.load(open('classes.json'))
y_pred_self = predict(x, w, classes)
- 结果不匹配
本质上,当我比较
y_pred_self
和 y_pred
时,它们并不相同(大约 85% 相似)。
所以我的问题是 scikit-learn softmax 或 predict
implementation 是否有一些 non-standard/hidden 调整?
旁注:我也在 Ruby 中尝试过自我实现,它也给出了错误的预测。
我第一眼就看出了一些差异。请看以下几点:
1.正则化
根据 docs scikit-learn 使用正则化项:
This class implements regularized logistic regression [...]. Note that regularization is applied by default.
因此,您可以从 scikit-learn 实现中停用正则化项,或者将正则化添加到您自己的实现中。
2。偏差
在文档中,您可以看到使用了偏差项:
fit_interceptbool, default=True
Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function.
因此您可以停用 scikit-learn 实现中的偏差或将偏差项添加到您的实现中。
也许使用 scikit-learn 库中的知名数据集或提供您的数据集,这样更容易重现问题。让我知道它是如何工作的。
我使用 scikit-learn 的逻辑回归分类器 (multinomial/multiclass) 训练了一个模型。然后我将模型中的系数保存到一个文件中。接下来,我将系数加载到我自己的 softmax 自我实现中,这就是 scikit-learn's documentation 声称逻辑回归分类器用于多项式案例的内容。但是,预测不一致。
- 使用 scikit-learn 训练 mlogit 模型
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import json
# Split data into train-test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
# Train model
mlr = LogisticRegression(random_state=21, multi_class='multinomial', solver='newton-cg')
mlr.fit(X_train, y_train)
y_pred = mlr.predict(X_test)
# Save test data and coefficients
json.dump(X_test.tolist(), open('X_test.json'), 'w'), indent=4)
json.dump(y_pred.tolist(), open('y_pred.json'), 'w'), indent=4)
json.dump(mlr.classes_.tolist(), open('classes.json'), 'w'), indent=4)
json.dump(mlr.coef_.tolist(), open('weights.json'), 'w'), indent=4)
- 通过Scipy 自行实现softmax
from scipy.special import softmax
import numpy as np
import json
def predict(x, w, classes):
z = np.dot(x, np.transpose(w))
sm = softmax(z)
return [classes[i] for i in sm.argmax(axis=1)]
x = json.load(open('X_test.json'))
w = json.load(open('weights.json'))
classes = json.load(open('classes.json'))
y_pred_self = predict(x, w, classes)
- 结果不匹配
本质上,当我比较
y_pred_self
和y_pred
时,它们并不相同(大约 85% 相似)。
所以我的问题是 scikit-learn softmax 或 predict
implementation 是否有一些 non-standard/hidden 调整?
旁注:我也在 Ruby 中尝试过自我实现,它也给出了错误的预测。
我第一眼就看出了一些差异。请看以下几点:
1.正则化
根据 docs scikit-learn 使用正则化项:
This class implements regularized logistic regression [...]. Note that regularization is applied by default.
因此,您可以从 scikit-learn 实现中停用正则化项,或者将正则化添加到您自己的实现中。
2。偏差
在文档中,您可以看到使用了偏差项:
fit_interceptbool, default=True
Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function.
因此您可以停用 scikit-learn 实现中的偏差或将偏差项添加到您的实现中。
也许使用 scikit-learn 库中的知名数据集或提供您的数据集,这样更容易重现问题。让我知道它是如何工作的。