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. выполнение регрессии здесь не является ракетостроением.
я делаю стандартный поезд-тест-сплит:
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 бункеров.
я играл с функциями потерь и другими параметрами, но Keras logreg остается примерно таким. Что может быть причиной проблемы?
edit: использование двоичной кроссэнтропии не является решением здесь, как показано на этом графике (обратите внимание, что входные данные изменились между двумя козни.)
1 ответов
хотя обе реализации являются формой логистической регрессии, существует довольно много различий. Хотя оба решения сходятся к сопоставимому минимуму (0.75 / 0.76 ACC), они не идентичны.
- оптимизатор-keras использует vanille SGD, где LR sklearn основан на liblinear, который реализует метод Ньютона доверительной области
- регуляризация-sklearn построил регуляризацию L2
- Весы-Весы случайным образом инициализировано и, вероятно, взято из другого дистрибутива.