gpt4 book ai didi

scikit-learn - Keras 和 Sklearn logreg 返回不同的结果

转载 作者:行者123 更新时间:2023-12-03 06:15:41 26 4
gpt4 key购买 nike

我正在将用 Keras 编写的逻辑回归器的结果与默认的 Sklearn Logreg 进行比较。我的输入是一维的。我的输出有两个类别,我对输出属于类别 1 的概率感兴趣。

我期望结果几乎相同,但它们甚至不接近。

这是我生成随机数据的方法。请注意,X_train、X_test 仍然是向量,我只是使用大写字母,因为我已经习惯了。在这种情况下也不需要缩放。

X = np.linspace(0, 1, 10000)
y = np.random.sample(X.shape)
y = np.where(y<X, 1, 0)

这是绘制在 X 上的 y 的总和。在这里进行回归并不是什么复杂的事情。

here's y plotted over x

我做了一个标准的训练-测试-分割:

X_train, X_test, y_train, y_test = train_test_split(X, y)
X_train = X_train.reshape(-1,1)
X_test = X_test.reshape(-1,1)

接下来,我训练一个默认的逻辑回归器:

from sklearn.linear_model import LogisticRegression
sk_lr = LogisticRegression()
sk_lr.fit(X_train, y_train)
sklearn_logreg_result = sk_lr.predict_proba(X_test)[:,1]

还有我用 Keras 编写的逻辑回归器:

from keras.models import Sequential
from keras.layers import Dense
keras_lr = Sequential()
keras_lr.add(Dense(1, activation='sigmoid', input_dim=1))
keras_lr.compile(loss='mse', optimizer='sgd', metrics=['accuracy'])
_ = keras_lr.fit(X_train, y_train, verbose=0)
keras_lr_result = keras_lr.predict(X_test)[:,0]

以及手工制作的解决方案:

pearson_corr = np.corrcoef(X_train.reshape(X_train.shape[0],), y_train)[0,1]
b = pearson_corr * np.std(y_train) / np.std(X_train)
a = np.mean(y_train) - b * np.mean(X_train)
handmade_result = (a + b * X_test)[:,0]

我预计这三者都会产生相似的结果,但发生的情况是这样的。这是使用 100 个 bin 的可靠性图。

enter image description here

我尝试过损失函数和其他参数,但 Keras logreg 大致保持这样。可能是什么原因导致了这里的问题?

编辑:使用二元交叉熵不是这里的解决方案,如此图所示(请注意,输入数据在两个图之间已发生变化)。

enter image description here

最佳答案

虽然这两种实现都是 Logistic 回归的一种形式,但存在相当多的差异。虽然两种解决方案都收敛到可比较的最小值(0.75/0.76 ACC),但它们并不相同。

  1. 优化器 - keras 使用 vanille SGD,其中 sklearn 的 LR 基于 liblinear它实现了 trust region Newton method
  2. 正则化 - sklearn 内置了 L2 正则化
  3. 权重 - 权重是随机初始化的,并且可能是从不同的分布中采样的。

关于scikit-learn - Keras 和 Sklearn logreg 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44930153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com