scikit-learn 逻辑回归预测与自我实现不同

Posted

技术标签:

【中文标题】scikit-learn 逻辑回归预测与自我实现不同【英文标题】:scikit-learn Logistic Regression prediction not same as self-implementation 【发布时间】:2020-06-12 02:01:23 【问题描述】:

我使用 scikit-learn 的 LogisticRegression 分类器(多项式/多类)训练了一个模型。然后我将模型中的系数保存到文件中。接下来,我将系数加载到我自己的 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_selfy_pred 时,它们并不相同(大约 85% 相似)。

所以我的问题是 scikit-learn softmax 或 predict implementation 是否有一些非标准/隐藏的调整?

旁注:我也在 Ruby 中尝试了自我实现,它也给出了不正确的预测。

【问题讨论】:

【参考方案1】:

乍一看,我发现了一些差异。请看以下几点:

1.正则化 根据docsscikit-learn 使用了正则化术语:

这个类实现了正则化逻辑回归 [...]。请注意,默认情况下会应用正则化。

因此,您可以从 scikit-learn 实现中停用正则化项,或者将正则化添加到您自己的实现中。

2。偏见 在文档中,您可以阅读到使用了偏见术语:

fit_interceptbool,默认=真 指定是否应将常数(也称为偏差或截距)添加到决策函数中。

因此,您可以在 scikit-learn 实施中停用偏差或将偏差项添加到您的实施中。

也许使用 scikit-learn 库中的知名数据集或提供您的数据集,这样更容易重现问题。让我知道它是如何工作的。

【讨论】:

很好的答案!解决方案是将偏差纳入计算。所以我通过json.dump(mlr.intercept_.tolist(), open('bias.json'), 'w'), indent=4) 保存了偏差值,并将predict(x, w, classes, bias) 函数的点积部分修改为z = np.dot(x, np.transpose(w))+bias。现在我在两种解决方案的预测之间都有 100% 的一致性!

以上是关于scikit-learn 逻辑回归预测与自我实现不同的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn python 的逻辑回归输出不匹配

[机器学习与scikit-learn-20]:算法-逻辑回归-线性逻辑回归linear_model.LogisticRegression与代码实现

[机器学习与scikit-learn-21]:算法-逻辑回归-多项式非线性回归PolynomialFeatures与代码实现

在 Python 中实现逻辑回归时 Scikit-learn ValueError

机器学习:基于逻辑回归对某银行客户违约预测分析

使用 scikit-learn 训练线性回归模型后,如何对原始数据集中不存在的新数据点进行预测?