Подтвердить что ты не робот

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

Я сравниваю результаты логистического регрессора, написанного в 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)

Здесь cumsum of y, построенный по X. Регрессия здесь не является ракетой.

здесь 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 остается примерно таким. Что может быть причиной проблемы здесь?

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

введите описание изображения здесь

4b9b3361

Ответ 1

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

  • Оптимизатор - keras использует vanille SGD, где sklearn LR основан на liblinear, который реализует область доверия метода Newton
  • Регуляризация - sklearn построил в L2-регуляризации
  • Массы - весы случайным образом инициализируются и, вероятно, выбираются из другого распределения.