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