3

我一直在學習神經網絡的課程,並不真正理解爲什麼我從邏輯迴歸的準確性分數和兩層神經網絡(輸入層和輸出層)中獲得不同的結果。輸出層使用sigmoid激活函數。根據我所瞭解的,我們可以在神經網絡中使用S形激活函數來計算概率。如果邏輯迴歸試圖完成的話,這應該是非常相似的。然後從那裏backpropogate使用梯度下降最小化錯誤。可能有一個簡單的解釋,但我不明白爲什麼準確度分數變化如此之大。在這個例子中,我沒有使用任何訓練或測試集,只是簡單的數據來展示我不明白的東西。神經網絡(無隱藏層)vs Logistic迴歸?

邏輯迴歸的準確性達到了71.4%。在下面的例子中,我只是爲'X'和結果'y'數組創建了數字。當結果等於'1'時,我故意讓'X'的數字更高,這樣線性分類器就可以具有一些準確性。

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 

然而,當我實現一個神經網絡,沒有隱藏層,只是用S形的激活函數的單個節點的輸出層(總共,輸入和輸出層這樣兩層)。我的準確性分數大概是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 

回答

4

你沒有比較相同的東西。 Sklearn的LogisticRegression設置了很多您在Keras實現中未使用的默認值。

迭代

數在Keras這是epochs期間fit()過去了:我其實考慮這些差別,其中主要是當對方的1E-8中得到的準確度。您將它設置爲12.在Sklearn中,這是在LogisticRegression__init__()期間通過的max_iter。它默認爲100

優化

您正在使用Keras的adam優化,而LogisticRegression默認使用liblinear優化。 Sklearn稱它爲solver

正規化

Sklearn的LogisticRegression使用L2正規化默認情況下,你是不是在做Keras任何重量正規化。在Sklearn中,這是penalty,在Keras中,您可以調整每層的權重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]]) 

Logistic迴歸

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 
+1

太謝謝你了!我沒有意識到這些參數會產生很大的差異。我們瞭解了這兩種模型,並且我認爲精確度得分幾乎相同。我真的想了解神經網絡如何工作,這真的有助於澄清事情。看起來我仍然需要花幾個小時來查看神經網絡的參數,以充分和真實地理解一切。再次感謝! – James