神经网络与二元分类指南

我有以下数据 (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 的可能性。从这一点开始,为了获得类别标签(例如 10),默认 API 使用 0.5 作为阈值来判定每个分数属于 class 1class 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],........

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注