Keras и Sklearn logreg возвращают разные результаты

я сравниваю результаты логистического регрессора, написанного в Keras, с логрегом Sklearn по умолчанию. Мой вклад одномерен. Мой вывод имеет два класса, и меня интересует вероятность того, что вывод принадлежит классу 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. выполнение регрессии здесь не является ракетостроением.

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]

и логистический регрессор, который я пишу в Керасе:

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 бункеров.

enter image description here

я играл с функциями потерь и другими параметрами, но Keras logreg остается примерно таким. Что может быть причиной проблемы?

edit: использование двоичной кроссэнтропии не является решением здесь, как показано на этом графике (обратите внимание, что входные данные изменились между двумя козни.)

enter image description here

1 ответов


хотя обе реализации являются формой логистической регрессии, существует довольно много различий. Хотя оба решения сходятся к сопоставимому минимуму (0.75 / 0.76 ACC), они не идентичны.

  1. оптимизатор-keras использует vanille SGD, где LR sklearn основан на liblinear, который реализует метод Ньютона доверительной области
  2. регуляризация-sklearn построил регуляризацию L2
  3. Весы-Весы случайным образом инициализировано и, вероятно, взято из другого дистрибутива.