gpt4 book ai didi

python - 多类 Keras 感知器分类器将所有内容分类为单个类

转载 作者:行者123 更新时间:2023-11-30 09:43:27 25 4
gpt4 key购买 nike

我的数据集具有以下形状

[[  1.   337.   118.   ...   9.65   1.     0.92]
[ 2. 324. 107. ... 8.87 1. 0.76]
[ 3. 316. 104. ... 8. 1. 0.72]
...
[498. 330. 120. ... 9.56 1. 0.93]
[499. 312. 103. ... 8.43 0. 0.73]
[500. 327. 113. ... 9.04 0. 0.84]]

最后一列是因变量,所有其他都是自变量。第一列是 ID 变量,我将其删除,因为我假设它不提供任何信息。

我将因变量分组到 5 个容器中,以这种方式表示 5 个类:

X = raw[:,1:8]
Y = raw[:,8]

def mapping(x):
if (x <= 0.5):
return 0;
if (x <= 0.65):
return 1;
if (x <= 0.8):
return 2;
if (x <= 0.9):
return 3;
if (x <= 1):
return 4;

Y = np.array(list(map(mapping, Y)))

最终的类(class)频率如下所示:

(array([0, 1, 2, 3, 4]), array([ 39, 119, 200,  81,  61]))

因此,某一类别并不比其他类别更普遍。

但是,当运行我的多层感知器模型时,它不断将所有内容分类为一类。哪个类取决于运行,但每个记录都是相同的。

我的模型如下:

Y = to_categorical(Y)

train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.33, random_state=10)

learning_rate = 0.001
n_layer_1 = 64
n_layer_2 = 64
num_classes = 5

def build_classification_model(train_set):
model = keras.Sequential([
layers.Dense(n_layer_1, activation=tf.nn.relu, input_shape=tuple([train_set.shape[1]])),
layers.Dense(n_layer_2, activation=tf.nn.relu, ),
layers.Dense(5, activation=tf.nn.softmax)
])

optimizer = tf.keras.optimizers.SGD()

model.compile(loss='categorical_crossentropy',
optimizer=optimizer,
metrics=['categorical_accuracy', 'mean_squared_error'])
return model

model = build_classification_model(train_X)
num_epochs = 200

print('Training...')
history = model.fit(train_X, train_Y, batch_size=500, epochs=num_epochs, verbose=0)
print('Done.')
prediction = model.predict(train_X)

每次运行预测都是这样:

array([[2.17507738e-17, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
2.74140113e-14],
[1.16876501e-17, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
1.38829174e-14],
[2.22264258e-18, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
4.08135584e-15],
...,
[2.78243342e-17, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
2.62153224e-14],
[1.69924047e-16, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
1.70491795e-13],
[5.26733592e-17, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
4.98645043e-14]], dtype=float32)

请注意,它选择了所有内容作为第 3 类。

添加新层、更改隐藏层中的节点数或更改学习率都没关系:每个记录的概率看起来都非常相同。

我做错了什么?

谢谢

最佳答案

我首先建议两件事:

  1. train_test_split 期间以分层方式分割数据,以确保您的训练集和测试集包含所有类别的具有代表性的样本数量。这很容易实现:

train_X、test_X、train_Y、test_Y = train_test_split(X、Y、test_size=0.33、
random_state=10,stratify=Y)

这将确保模型接受来自所有类别的相当数量的样本的训练。

  • 您的批量太大,我认为这里存在误解。使用 SGD 时,批量大小是进行梯度更新之前网络处理的样本数量,而不是拥有的训练样本数量。从表面上看,你甚至没有 500 个训练样本。小批量大小(通常使用默认值 32)可确保每个时期梯度的多次更新。大量的梯度更新对于梯度下降来说更有效,梯度下降在每次梯度更新时都采取小步长。考虑到您的参数数量,当前网络设置的 200 次更新并不是很多,因此请减少批量大小!
  • 关于python - 多类 Keras 感知器分类器将所有内容分类为单个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944143/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com