【问题标题】:Binary classification always outputs 1二进制分类总是输出 1
【发布时间】:2017-11-16 03:18:10
【问题描述】:

我正在keras 上迈出第一步,我正在尝试对scikit-learn 中可用的癌症数据集进行二进制分类

# load dataset
from sklearn import datasets
cancer = datasets.load_breast_cancer()
cancer.data

# dataset into pd.dataframe
import pandas as pd
donnee = pd.concat([pd.DataFrame(data = cancer.data, columns = cancer.feature_names), 
                   pd.DataFrame(data = cancer.target, columns = ["target"])
                      ], axis = 1)

# train/test split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(donnee.loc[:, donnee.columns != "target"], donnee.target, test_size = 0.25, random_state = 1)

我正在尝试在这里学习 keras 的教程:https://keras.io/#getting-started-30-seconds-to-keras

问题是,我总是得到相同的损失值 (6.1316862406430541) 和相同的准确度 (0.61538461830232527),因为预测总是 1。

我不确定是不是因为代码错误:

  • 不知道是不是X_train的形状不对?
  • 或者我在 epochs 和/或 batch_size 上做错了什么。

或者如果是因为网络本身:

  • 如果我没记错的话,如果层没有偏差,那么所有 1 预测都是可能的,而且我还不知道它们是如何初始化的
  • 但也许是别的东西,也许只有一层太少了? (如果是这样,我想知道为什么 keras 的教程只有 1 层......)

这是我的代码,如果你有任何想法:

import keras
from keras.models import Sequential

model = Sequential()

from keras.layers import Dense

model.add(Dense(units=64, activation='relu', input_dim=30))
model.add(Dense(units=1, activation='sigmoid'))
model.summary()

model.compile(loss = keras.losses.binary_crossentropy,
              optimizer = 'rmsprop',
              metrics=['accuracy']
              )

model.fit(X_train.as_matrix(), y_train.as_matrix().reshape(426, -1), epochs=5, batch_size=32)

loss_and_metrics = model.evaluate(X_test.as_matrix(), y_test.as_matrix(), batch_size=128)
loss_and_metrics

classes = model.predict(X_test.as_matrix(), batch_size=128)
classes 

【问题讨论】:

  • 你能添加一个小数据样本,你们中的一些 x_train 列和你的 y train 列吗?
  • 您可以通过在问题之上运行代码来获取数据。完整的数据集是 569 行 x 31 列,它不会融化你的计算机;)

标签: neural-network keras


【解决方案1】:

这是一个非常常见的情况。如果您检查数据的直方图,您将看到数据集中有数据点,其坐标范围从 0100。当您将此类数据提供给神经网络时,sigmoid 的输入可能会太大,以至于它会遭受下溢。为了扩展数据,您可以使用 MinMaxScalerStandardScaler,这要感谢您使数据具有适合神经网络计算的跨度。

【讨论】:

  • 谢谢。确实,由于这个答案,我理解了这个问题:stackoverflow.com/a/45319602/4348534。这个问题也可以通过不在 sigmoid 之前链接 relu 来解决,例如在多个 sigmoid 之前。
  • 实际上 - 这可能会在第一个 sigmoid 层中导致类似的问题。这是由于sigmoid 饱和造成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多