我有以下数据 (X),存储在一个 numpy 数组中:
array([[ 0.82737724, -0.5924806 , 0.43279337, ..., 0.91896631, -0.28188124, 0.58595414], [-1.56610693, 0.63878901, 0.43279337, ..., 1.28262456, 1.16154512, -1.9423032 ], [ 0.82737724, -0.2846632 , -0.4745452 , ..., 1.64628282, -0.28188124, 0.58595414], ..., [ 0.82737724, 0. , 0.43279337, ..., 1.67617254, -0.28188124, 0.58595414], [-1.56610693, -0.2846632 , -0.4745452 , ..., -1.64656796, 0.27001707, -1.9423032 ], [ 0.82737724, 0.17706291, -0.4745452 , ..., 0.63501397, -0.28188124, -0.67817453]])
这个数组要大得多,并且会被输入到以下神经网络中:
def base_model1(): input_dim = X.shape[1] output_dim = 1 model = Sequential() model.add(Dense(10, input_dim= input_dim,kernel_initializer ='normal', activation= 'tanh')) model.add(Dense(1, input_dim = 100, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['MeanSquaredError', 'AUC',]) return modelNN_clf = KerasClassifier(build_fn=base_model1, epochs=100, verbose=1)NN_clf._estimator_type = "classifier"trained = NN_clf.fit(X,y.values.reshape(-1,1))
Y 是二元的 1 和 0,其中 1 表示会乘坐出租车,0 表示不会乘坐出租车。
predictions1 = trained.model.predict(X_test, verbose=1)predictions1[:5]array([[0.09048176], [0.34411064], [0.08842686], [0.0986585 ], [0.58971184]], dtype=float32)
我的问题源自这里,如果 Sigmoid 是一个执行二元分类的激活层,或者这些是概率输出?因为我期待的是 1 和 0,我最终假设这些是概率输出,我创建了以下代码:
blank = []for i in pd.DataFrame(predictions1)[0].to_list(): if i > .50: blank.append(1) else: blank.append(0)
我对二元分类的大部分困惑在于神经网络如何处理它们,以及如何得到 1 和 0。
回答:
当你将一些 input
传递给你的二元分类器(其最后一层使用 sigmoid
激活函数)进行预测时,它将给你矩阵,每行代表这些输入属于 class 1
的概率。在你的例子中:
predictions1 = trained.model.predict(X_test, verbose=1)predictions1[:5]array([[0.09048176], [0.34411064], [0.08842686], [0.0986585 ], [0.58971184]],
这里,每个分数代表 X_test[:5]
中每个样本属于 class 1
的可能性。从这一点开始,为了获得类别标签(例如 1
和 0
),默认 API 使用 0.5
作为阈值来判定每个分数属于 class 1
或 class 0
;更具体地说,分数大于 0.5
被认为属于 class 1
。当然,我们可以调整这个阈值。下面是一个简单的例子:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])model.fit(img, tar, epochs=5, verbose=2)Epoch 1/51/1 - 0s - loss: 0.7058 - accuracy: 0.5500Epoch 2/51/1 - 0s - loss: 0.6961 - accuracy: 0.5500Epoch 3/51/1 - 0s - loss: 0.6869 - accuracy: 0.5500Epoch 4/51/1 - 0s - loss: 0.6779 - accuracy: 0.6000Epoch 5/51/1 - 0s - loss: 0.6692 - accuracy: 0.6000
概率
y_pred = model.predict(img)print(y_pred.shape)y_pred[:10](20, 1)array([[0.5317636 ], [0.4592613 ], [0.5876541 ], [0.47071406], [0.56284094], [0.5025074 ], [0.46471453], [0.38649547], [0.43361676], [0.4667967 ]], dtype=float32)
类别标签
(model.predict(img) > 0.5).astype("int32")array([[1], [0], [1], [0], [1], [1], [0], [0], [0], [0], [0],........