我将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)
这里的y在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个箱的可靠性图。
我玩过丢失函数和其他参数,但Keras logreg大致保持这样。可能是什么原因引起了这个问题?
编辑:使用二进制交叉熵不是这里的解决方案,如此图所示(请注意,输入数据在两个图之间发生了变化)。
答案 0 :(得分:1)
虽然两种实现都是Logistic回归的一种形式,但存在很多差异。虽然两种解决方案都收敛到可比较的最小值(0.75 / 0.76 ACC),但它们并不相同。