Нейронная сеть (без скрытых слоев) против логистической регрессии?

Я брал урок по нейронным сетям и не очень понимаю, почему я получаю разные результаты из оценки точности логистической регрессии и двухслойной нейронной сети (входной слой и выходной слой). Выходной слой использует функцию активации сигмоида. Из того, что я узнал, мы можем использовать функцию активации сигмоида в нейронных сетях для вычисления вероятности. Это должно быть очень похоже, если не идентично тому, что пытается достичь логистическая регрессия. Затем оттуда backpropogate, чтобы минимизировать ошибку с помощью градиентного спуска. Вероятно, есть простое объяснение, но я не понимаю, почему оценки точности так сильно различаются. В этом примере я не использую какие-либо обучающие или тестовые наборы, просто простые данные, чтобы продемонстрировать то, что я не понимаю.

Я получаю точность 71,4% для логистической регрессии. В приведенных ниже примерах я только что создал числа для массива 'X' и результатов 'y'. Я специально увеличил числа для "X", когда результат равен "1", чтобы линейный классификатор мог иметь некоторую точность.

import numpy as np
from sklearn.linear_model import LogisticRegression
X = np.array([[200, 100], [320, 90], [150, 60], [170, 20], [169, 75], [190, 65], [212, 132]])
y = np.array([[1], [1], [0], [0], [0], [0], [1]])

clf = LogisticRegression()
clf.fit(X,y)
clf.score(X,y) ##This results in a 71.4% accuracy score for logistic regression

Однако, когда я реализую нейронную сеть без скрытых слоев, я просто использую функцию активации сигмоида для выходного слоя с одним узлом (всего два слоя, входной и выходной уровни). Мой показатель точности составляет около 42,9%? Почему это существенно отличается от показателя точности логистической регрессии? И почему это так низко?

import keras
from keras.models import Sequential
from keras.utils.np_utils import to_categorical
from keras.layers import Dense, Dropout, Activation

model = Sequential()

#Create a neural network with 2 input nodes for the input layer and one node for the output layer. Using the sigmoid activation function
model.add(Dense(units=1, activation='sigmoid', input_dim=2))
model.summary()
model.compile(loss="binary_crossentropy", optimizer="adam", metrics = ['accuracy'])
model.fit(X,y, epochs=12)

model.evaluate(X,y) #The accuracy score will now show 42.9% for the neural network

1 ответ

Решение

Вы не сравниваете одно и то же. LogisticRegression Sklearn устанавливает множество значений по умолчанию, которые вы не используете в своей реализации Keras. Я фактически получаю точность в пределах 1e-8 друг от друга при учете этих различий, основными из которых являются:

Количество итераций

В Керасе это epochs прошло во время fit(), Вы устанавливаете его на 12. В Sklearn это max_iter прошло во время LogisticRegression"s __init__(), По умолчанию это 100.

оптимизатор

Вы используете adam оптимизатор в Керасе, тогда как LogisticRegression использует liblinear оптимизатор по умолчанию. Склеарн называет это solver,

регуляризация

Sklearn-х LogisticRegression по умолчанию используется регуляризация L2, а в Keras вы не делаете регуляризацию веса. В Склеарне это penalty и в Керасе вы можете регулировать веса с каждым слоем kernel_regularizer,

Обе эти реализации достигают точности 0,5714%:

import numpy as np

X = np.array([
  [200, 100], 
  [320, 90], 
  [150, 60], 
  [170, 20], 
  [169, 75], 
  [190, 65], 
  [212, 132]
])
y = np.array([[1], [1], [0], [0], [0], [0], [1]])

Логистическая регрессия

from sklearn.linear_model import LogisticRegression

# 'sag' is stochastic average gradient descent
lr = LogisticRegression(penalty='l2', solver='sag', max_iter=100)

lr.fit(X, y)
lr.score(X, y)
# 0.5714285714285714

Нейронная сеть

from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l2

model = Sequential([
  Dense(units=1, activation='sigmoid', kernel_regularizer=l2(0.), input_shape=(2,))
])

model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X, y, epochs=100)
model.evaluate(X, y)
# 0.57142859697341919
Другие вопросы по тегам