Я сравниваю результаты логистического регрессора, написанного в 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. Регрессия здесь не является ракетой.
Я выполняю стандартный пот-тест-раскол:
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: Использование бинарной кроссентропии здесь не является решением, как показано на этом графике (обратите внимание, что входные данные изменились между двумя графиками).